package 设计二构造版本2;

import java.util.Random;

/**
 * 加法算式子类，继承自fermula抽象类
 */
public class AddFormula extends fermula {
    
    /**
     * 无参构造函数
     */
    public AddFormula() {
        this.operator = '+';
    }
    
    /**
     * 生成随机加法算式
     * 确保和不超过100
     * @param random 随机数生成器
     */
    @Override
    public void generate(Random random) {
        // 确保和不超过100
        leftOperand = random.nextInt(99) + 1; // 1-99
        rightOperand = random.nextInt(100 - leftOperand) + 1; // 1-(100-leftOperand)
        calculate();
    }
    
    /**
     * 计算加法结果
     */
    @Override
    protected void calculate() {
        this.result = leftOperand + rightOperand;
    }
    
    /**
     * 判断两个加法算式是否相等（考虑交换律）
     * @param obj 要比较的对象
     * @return 如果相等返回true，否则返回false
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        AddFormula other = (AddFormula) obj;
        // 加法满足交换律，所以a+b和b+a视为相等
        return (leftOperand == other.leftOperand && rightOperand == other.rightOperand) ||
               (leftOperand == other.rightOperand && rightOperand == other.leftOperand);
    }
    
    /**
     * 计算加法算式的哈希码（考虑交换律）
     * @return 哈希码
     */
    @Override
    public int hashCode() {
        // 确保a+b和b+a的哈希码相同
        int min = Math.min(leftOperand, rightOperand);
        int max = Math.max(leftOperand, rightOperand);
        int result = 17;
        result = 31 * result + min;
        result = 31 * result + max;
        result = 31 * result + operator;
        return result;
    }
}